package com.itqf.proxy.dynamic_proxy1.factoy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Description:  创建（代理）对象
 * 1）工厂设计模式
 * 2）动态代理
 * @Company: 千锋互联
 * @Author: 李丽婷
 * @Date: 2020/11/10
 * @Time: 上午11:10
 */
public class MyProxyFactory {

    public   static <T extends  Object> T createProxyFactory(T object){
        //1,创建被代理对象  参数
        //2.创建代理对象
        /**
         * * @param  类加载器  object.getClass().getClassLoader()  MyProxyFactory.class.getClassLoader()
         *   @param   interfaces 代理类的接口列表  跟被代理的接口列表一致
         *   to implement
         *   @param   h  处理器   创建的代理对象  调用方法时会执行该处理器中的invoke方法
         */
        return (T)Proxy.newProxyInstance(object.getClass().getClassLoader(),
                object.getClass().getInterfaces(), new InvocationHandler() {

                    /**
                     *
                     * @param proxy 代理对象  不要在invoke方法中随便使用
                     * @param method 被代理的方法   addOrder  addGoods
                     * @param args  被代理类的参数列表  addGoods(String name)
                     * @return
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object result = null;
                        try {
                            System.out.println("开启事务.....");
                            //conn.setAutoCommit(false);

                            //代理功能   调用被代理类的方法
                            //增强调用的方法
                            //参数一：被代理对象  参数二：被代理对象中的方法的参数
                            result = method.invoke(object,args);

                            System.out.println("提交事务");
                            //conn.commit();
                           // MybatisUtils.commit();

                        } catch (Exception e) {
                            System.out.println("回滚事务！！"+e.getMessage());
                           // conn.rollback();
                            //MybatisUtils.rollback();
                        }

                        return result;
                    }
                });//创建代理对象



    }

}
